package data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import dataTransferObject.Lugar;
import dataTransferObject.Ubicacion;

public class JDBCLugarDAO implements ILugarDAO {

	private ILugarTempDAO lugarTempDAO;
	private IUbicacionDAO ubicacionDAO;
	
	public JDBCLugarDAO() {
		lugarTempDAO = new JDBCLugarTempDAO();
		ubicacionDAO = new JDBCUbicacionDAO();
	}

	public List<Lugar> selectLugares(int idCategoria, int idZona) {
		Connection conn = ConnectionManager.getInstance().CheckOut();
		PreparedStatement stmt = null;
		List<Lugar> listResult = new LinkedList<Lugar>();
		String sql = "SELECT * FROM lugar JOIN ubicacion USING (ID_UBICACION)" +
				     " WHERE ID_CATEGORIA = ? AND ID_ZONA = ? ORDER BY NOMBRE";
		ResultSet result = null;
		
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, idCategoria);
			stmt.setInt(2, idZona);
			result = stmt.executeQuery();
			
			while (result.next()) {
				Lugar transfer = new Lugar();
				transfer.setIdLugar(result.getInt("ID_LUGAR"));
				transfer.setNombre(result.getString("NOMBRE"));
				transfer.setDescripcion(result.getString("DESCRIPCION"));
				transfer.setHorario(result.getString("HORARIO"));
				listResult.add(transfer);
			}
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().CheckIn(conn);
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (Exception e) {
			}
		}
		return listResult;
	}

	public Lugar selectLugar(int idLugar) {
		Connection conn = ConnectionManager.getInstance().CheckOut();
		PreparedStatement stmt = null;
		Lugar transfer = new Lugar();
		String sql = "SELECT * FROM lugar WHERE ID_LUGAR = ?";
		ResultSet result = null;
		
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, idLugar);
			result = stmt.executeQuery();

			if (result.next()) {
				transfer.setIdLugar(result.getInt("ID_LUGAR"));
				transfer.setIdCategoria(result.getInt("ID_CATEGORIA"));
				transfer.setNombre(result.getString("NOMBRE"));
				transfer.setDescripcion(result.getString("DESCRIPCION"));
				transfer.setHorario(result.getString("HORARIO"));
				transfer.setURL_Lugar(result.getString("URL_MAPA"));
				transfer.setSuperficie(result.getInt("SUPERFICIE"));
				transfer.setServicios(result.getInt("SERVICIOS"));
				transfer.setBar(result.getInt("BAR"));
				transfer.setMascotas(result.getInt("MASCOTAS"));
				transfer.setAlimentacion(result.getInt("ALIMENTACION"));
				transfer.setAccesorios(result.getInt("ACCESORIOS"));
				transfer.setPeluqueria(result.getInt("PELUQUERIA"));
				transfer.setUrgencias(result.getInt("URGENCIAS"));
				transfer.setUbicacion(ubicacionDAO.selectUbicacion(conn,result.getInt("ID_UBICACION")));
			}
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().CheckIn(conn);
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (Exception e) {
			}
		}	
		return transfer;
	}
	
	public void insertLugar(Lugar lugar, int idLugarTemp) {
		Connection conn = ConnectionManager.getInstance().CheckOut();
		lugarTempDAO.deleteLugar(conn, idLugarTemp);
		PreparedStatement stmt = null;
		String sql = "INSERT INTO lugar" +
				" (NOMBRE, ID_CATEGORIA, ID_UBICACION, DESCRIPCION, HORARIO, URL_MAPA, SUPERFICIE," +
				" SERVICIOS, BAR, MASCOTAS, ALIMENTACION, ACCESORIOS, PELUQUERIA, URGENCIAS)" +
				" VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
		try {
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, lugar.getNombre());
			stmt.setInt(2, lugar.getIdCategoria());
			stmt.setInt(3, lugar.getUbicacion().getIdUbicacion());
			stmt.setString(4, lugar.getDescripcion());
			stmt.setString(5, lugar.getHorario());
			stmt.setString(6, lugar.getURL_Lugar());
			stmt.setInt(7, lugar.getSuperficie());
			stmt.setInt(8, lugar.getServicios());
			stmt.setInt(9, lugar.getBar());
			stmt.setInt(10, lugar.getMascotas());
			stmt.setInt(11, lugar.getAlimentacion());
			stmt.setInt(12, lugar.getAccesorios());
			stmt.setInt(13, lugar.getPeluqueria());
			stmt.setInt(14, lugar.getUrgencias());
			stmt.executeUpdate();
        } catch (SQLException e) {
            System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
        } finally {
        	ConnectionManager.getInstance().CheckIn(conn);
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }
	}

	public List<Lugar> selectLugaresDeInteres(Connection conn,int idUsuario) {
		List<Lugar> resultado = new ArrayList<Lugar>();
		 PreparedStatement stmt = null;
	        ResultSet result = null;
	        Lugar lugar = null;
	        String sql = "SELECT ID_LUGAR FROM interes WHERE ID_USUARIO=?";

	        try {
	            stmt = conn.prepareStatement(sql);
	            stmt.setInt(1, idUsuario);
	            result = stmt.executeQuery();

	            while (result.next()) {
	            	int idLugar = result.getInt("ID_LUGAR");
	            	 lugar = selectLugar(idLugar);
	            	 resultado.add(lugar);
	            }
	            
	           
	        } catch (SQLException e) {
	            System.out.println("selectLugaresDeInteres Message: " + e.getMessage());
	            System.out.println("selectLugaresDeInteres SQLState: " + e.getSQLState());
	            System.out.println("selectLugaresDeInteres ErrorCode: " + e.getErrorCode());
	        } finally {
	            try {
	                if (result != null) {
	                    result.close();
	                }
	                if (stmt != null) {
	                    stmt.close();
	                }
	            } catch (SQLException e) {
	            }
	        }
	        return resultado;
	}

	public List<Lugar> selectAllLugares() {
		Connection conn = ConnectionManager.getInstance().CheckOut();
		ArrayList<Lugar> lista= new ArrayList<Lugar>();
		Lugar lugar=null;
		Statement stat=null;
		ResultSet resultSet=null;
		try{
		stat = conn.createStatement();
	
		resultSet= stat.executeQuery("SELECT ID_LUGAR FROM petsociety.lugar lugar");
		
		while(resultSet.next()){
			 lugar=new Lugar();
			 lugar= selectLugar(resultSet.getInt("ID_LUGAR"));
			 lista.add(lugar);
		}
		
		
		} catch(SQLException e) { 
			System.out.println("Message: " + e.getMessage());
	        System.out.println("SQLState: " + e.getSQLState());
	        System.out.println("ErrorCode: " + e.getErrorCode());
			
		}finally {
			ConnectionManager.getInstance().CheckIn(conn);
	        try {
	            if (resultSet != null)
	                resultSet.close();
	            if (stat != null)
	                stat.close();
	        } catch (SQLException e) {
	        } 
		}
	return lista;	
	}
	@Override
	public List<Lugar> getLugares(List<Ubicacion> ubCercanas) {
		
		Connection conn = ConnectionManager.getInstance().CheckOut();
		String sql = "SELECT ID_LUGAR,NOMBRE,ubicacion.DIRECCION, ubicacion.ID_UBICACION FROM lugar,ubicacion WHERE ubicacion.ID_UBICACION=lugar.ID_UBICACION and lugar.ID_UBICACION=?";
		
        List<Lugar> resultadoLugares=new ArrayList<Lugar>();
        PreparedStatement stat = null;
		ResultSet resultSet = null;
		try {
			stat = conn.prepareStatement(sql);
			for(Ubicacion u:ubCercanas){

			stat.setInt(1,u.getIdUbicacion());// sustituyo la interrogacion 1

			resultSet = stat.executeQuery(); //Guardamos la query en una tabla
			
			}
			while (resultSet.next()) {
				Lugar lugar=new Lugar();
				lugar.setIdLugar(resultSet.getInt("ID_LUGAR"));
				lugar.setNombre(resultSet.getString("NOMBRE"));
				lugar.setUbicacion(new Ubicacion());
				lugar.getUbicacion().setDireccion(resultSet.getString("DIRECCION"));
				
				
				
				resultadoLugares.add(lugar);
			}

		} catch (SQLException e) {
			System.out.println("selectUbicacion Message: " + e.getMessage());
			System.out.println("selectUbicacion SQLState: " + e.getSQLState());
			System.out
					.println("selectUbicacion ErrorCode: " + e.getErrorCode());

		} finally {
			ConnectionManager.getInstance().CheckIn(conn);
			try {
				if (resultSet != null)
					resultSet.close();
				if (stat != null)
					stat.close();
			} catch (SQLException e) {
			}
		}
		return resultadoLugares;
	}
}
